/*
 * Copyright (c) 2024 Huawei Technologies Co., Ltd.
 * openUBMC is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *         http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */

#ifndef DRIVERS_HISPORT_H
#define DRIVERS_HISPORT_H

#include <cstdint>
#include <string>
#include <string_view>

namespace DRIVER_HISPORT {

// Hisport 数据结构体
struct HISPORT_DATA_S {
    uint8_t  bus_id;       // 总线ID
    uint32_t addr;         // 地址
    uint32_t offset;       // 偏移量
    uint8_t  offset_width; // 偏移量宽度
    uint32_t data_width;   // 数据宽度
    uint32_t rx_len;       // 接收长度
    uint8_t  rw_flag;      // 接收标志 (1:读, 0:写)
    uint8_t  re_write_cnt; // 重写次数
    uint8_t  re_read_cnt;  // 重读次数
    uint32_t write_delay;  // 写入延迟
};

// Hisport 初始化结构体
struct HISPORT_INIT_S {
    uint8_t  bus_num;          // 总线号
    uint8_t  reg_num;          // 寄存器数量
    uint8_t  flag_num;         // 标志位数量
    uint8_t  send_reg_addr;    // 发送寄存器地址
    uint8_t  recv_reg_addr;    // 接收寄存器地址
    uint8_t  flag_reg_addr;    // 标志寄存器地址
    uint8_t  max_batch_len;    // 最大批处理长度
    uint32_t max_data_len;     // 最大数据长度
    uint8_t  max_offset_width; // 最大偏移宽度
    uint8_t  max_length_width; // 最大长度宽度
};

// Hisport 驱动类
class Hisport {
public:
    Hisport()  = default;
    ~Hisport() = default;

    // 初始化Hisport驱动（打桩）
    void init(const HISPORT_INIT_S& init_data, std::string bus_name);

    // 锁定总线
    void lock();

    // 解锁总线
    void unlock();

    // 读取数据
    std::string read(const HISPORT_DATA_S& read_data);

    // 写入数据
    void write(const HISPORT_DATA_S& write_data, std::string_view& data);

    // 参数验证函数
    void validate_offset_width(uint8_t offset_width);
    void validate_data_width(uint32_t data_width);
};

} // namespace DRIVER_HISPORT

#endif // DRIVERS_HISPORT_H